package outils.animations;

import controleur.EcouteurDeSourisJeu;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import modele.Plateau;
import modele.case_.Case;
import modele.pion.Pion;
import modele.pion.nautique.Barque;
import outils.ImageOutils;
import outils.Outils;
import outils.gestionnairefichier.GestionnaireImage;
import vue.AireDeJeu;
import vue.Camera;

/**
 *
 * @author twane
 */
public class AnimationSpeciale {

	/**
	 *
	 * @param aire
	 * @param bCroix
	 */
	public static void animationCroix(final AireDeJeu aire, final JButton bCroix) {
		final Point destination = recupererDestination(aire);

		if (destination != null) {

			final JDialog d = new JDialog();
			d.getContentPane().add(new JLabel("Something"));
			d.setUndecorated(true);
			d.setLocation(0, 0);
			d.setSize(0, 0);
			d.setVisible(true);

			int delaisInterFrames = 50;
			int tempsAnimation = 1000;
			final int nbFrames = tempsAnimation / delaisInterFrames;

			final int depX = (destination.x - bCroix.getLocationOnScreen().x) / nbFrames;
			final int depY = (destination.y - bCroix.getLocationOnScreen().y) / nbFrames;

			final Icon contenuBoutton = bCroix.getIcon();
			final Timer timer = new Timer();
			TimerTask deplacer;
			deplacer = new TimerTask() {
				int nbFramesRestantes = nbFrames;

				@Override
				public void run() {
					SwingUtilities.invokeLater(new Runnable() {
						@Override
						public void run() {
							if (nbFramesRestantes == nbFrames) {
								bCroix.setIcon(new ImageIcon("src/donnees/images/Transparent.png"));
								BufferedImage croix = GestionnaireImage.getInstance().get("src/donnees/images/Croix.png");
								d.setContentPane(new JLabel(new ImageIcon(croix)));
								d.setLocation(bCroix.getLocationOnScreen());
								d.pack();
							}

							if (nbFramesRestantes == 0) {
								timer.cancel();
								animerExplosion(aire, bCroix, contenuBoutton);
								d.setVisible(false);

							} else {
								Point p = d.getLocation();
								d.setLocation(p.x + (destination.x - p.x) / nbFramesRestantes, p.y + (destination.y - p.y) / nbFramesRestantes);
								nbFramesRestantes--;
							}
						}
					});
				}
			};

			timer.schedule(deplacer, 500, delaisInterFrames);
		}
	}

	private static Point recupererDestination(AireDeJeu aire) {
		Camera cam = aire.getCamera();
		EcouteurDeSourisJeu ecouteur = (EcouteurDeSourisJeu) aire.getEcouteur();
		Pion pion = ecouteur.getPionSelectionne();
		if (pion != null) {
			Point coordPlateau = pion.getCase().getCoord();

			Rectangle vue = cam.getRectangle();
			int xHG = (coordPlateau.x) * Plateau.TAILLE_CASE - vue.x;
			int yHG = (coordPlateau.y) * Plateau.TAILLE_CASE - vue.y;

			Point coinHGAire = aire.getLocationOnScreen();
			Point coordScreen = new Point(xHG + coinHGAire.x, yHG + coinHGAire.y);

			return coordScreen;
		} else {
			return null;
		}
	}

	public static void animerExplosion(final AireDeJeu aire, JButton bCroix, Icon contenuBoutton) {
		Pion pionSelect = ((EcouteurDeSourisJeu) aire.getEcouteur()).getPionSelectionne();
		if (pionSelect != null) {
			Point coordPlateau = pionSelect.getCase().getCoord();
			Rectangle vue = aire.getCamera().getRectangle();
			int xHG = (coordPlateau.x) * Plateau.TAILLE_CASE - vue.x;
			int yHG = (coordPlateau.y) * Plateau.TAILLE_CASE - vue.y;
			BufferedImage croix = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
			Graphics2D g2 = (Graphics2D) croix.createGraphics();
			final BufferedImage bufferAnimation = aire.getBufferAnimation();
			final Graphics2D ba = (Graphics2D) bufferAnimation.createGraphics();

			g2.drawImage(GestionnaireImage.getInstance().get("src/donnees/images/Croix.png"), null, 0, 0);

			final BufferedImage tabCarres[] = new BufferedImage[25];
			final Point coordCarres[] = new Point[25];
			final double rotationCase[] = new double[25];

			for (int i = 0; i < 25; i++) {
				rotationCase[i] = 0;
			}

			for (int x = 0; x < 5; x++) {
				for (int y = 0; y < 5; y++) {
					tabCarres[y * 5 + x] = croix.getSubimage(x * 10, y * 10, 10, 10);
					coordCarres[y * 5 + x] = new Point(x * 10 + xHG, y * 10 + yHG);
				}
			}

			int delaisInterFrames = 50;
			int tempsAnimation = 2000;
			final int nbFrames = tempsAnimation / delaisInterFrames;

			final javax.swing.Timer timer = new javax.swing.Timer(delaisInterFrames, null);
			timer.addActionListener(new ActionListener() {
				int nbFramesRestantes = nbFrames;
				EcouteurDeSourisJeu ecouteurTmp = (EcouteurDeSourisJeu) aire.getEcouteur();

				@Override
				public void actionPerformed(ActionEvent e) {
					if (nbFramesRestantes == 0) {
						timer.stop();
						aire.getCamera().setFreeze(false);
						ImageOutils.viderBufferedImage(bufferAnimation);
						aire.repaint();
						aire.setEcouteur(ecouteurTmp);
					} else {
						modifierCoordExplosion();
						afficherExplosion();
					}
					nbFramesRestantes--;
				}

				private void modifierCoordExplosion() {
					for (int x = 0; x < 5; x++) {
						for (int y = 0; y < 5; y++) {
							if (!(x == 2 && y == 2)) {
								coordCarres[y * 5 + x].x += (x - 2) * 2;
								coordCarres[y * 5 + x].y += (y - 2) * 2;
								rotationCase[y * 5 + x] += (Outils.rand.nextInt(2) - 1) * Math.PI / 4;
							}
						}
					}
				}

				private void afficherExplosion() {
					ImageOutils.viderBufferedImage(bufferAnimation);
					AffineTransform at = new AffineTransform();
					Pion faible = new Barque(null, null);
					for (int i = 0; i < 25; i++) {
						Point point = aire.getCaseCoordonnees(new Point(coordCarres[i].x + 4, coordCarres[i].y + 4));
						if (point.x < aire.getPlateau().getLargeur() && point.x < aire.getPlateau().getHauteur()) {
							Case c = aire.getPlateau().getCase(point);
							if (c != null && c.getPion() != null) {
								faible.attaque(c.getPion());
							}
						}
						at = new AffineTransform();
						at.translate(coordCarres[i].x + 4, coordCarres[i].y + 4);
						at.rotate(rotationCase[i]);
						at.translate(-tabCarres[i].getWidth() / 2, -tabCarres[i].getHeight() / 2);
						ba.drawImage(tabCarres[i], at, null);
					}
					aire.actualiserBuffers();
				}
			});

			timer.start();
			aire.masquerDeplacement();
			((EcouteurDeSourisJeu) aire.getEcouteur()).setPionSelectionne(null);
			aire.setEcouteur(null);
			aire.repaint();

			bCroix.setIcon(contenuBoutton);
		}

	}
}
